package pe.gob.mininter.dirandro.vaadin.panel.mantenimiento;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Organizacion;
import pe.gob.mininter.dirandro.service.OrganizacionService;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.TablaFiltro;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer.TipoComponente;
import pe.gob.mininter.dirandro.vaadin.util.event.TablaFiltroEnterEvent;
import pe.gob.mininter.dirandro.vaadin.util.listener.TablaFiltroEnterListener;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class PanelMantenOrganizacion extends DirandroComponent implements TablaFiltroEnterListener,ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout pnlPrincipal;
	@AutoGenerated
	private VerticalLayout pnl2;
	@AutoGenerated
	private VerticalLayout pnl2_1;
	@AutoGenerated
	private HorizontalLayout lytBotones;
	@AutoGenerated
	private Button btnEliminar;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private TextField txtUbicacionActivos;
	@AutoGenerated
	private TextField txtZonaOperacion;
	@AutoGenerated
	private TextField txtNroIntegrantes;
	@AutoGenerated
	private TextField txtCampo;
	@AutoGenerated
	private TextField txtDescripcion;
	@AutoGenerated
	private TextField txtNombre;
	@AutoGenerated
	private Label lblAdministracion;
	@AutoGenerated
	private VerticalLayout pnl1;
	@AutoGenerated
	private TablaFiltro tblOrganizacion;
	@AutoGenerated
	private Label lblFiltro;
	private TablaFiltroIndexedContainer container;
	
	private Long id;
	private OrganizacionService organizacionService;
	
	public static final String COLUMNA_ORGANIZACION = "organizacion";
	public static final String COLUMNA_NOMBRE = "nombre";
	public static final String COLUMNA_CAMPO = "campo";
	public static final String COLUMNA_NRO_INTEGRANTE = "nroIntegrante";
	public static final String COLUMNA_ZONA_OPERACION = "zonaOperacion";
	public static final String COLUMNA_UBICACION_ACTIVO = "ubicacionActivo";
	
	public PanelMantenOrganizacion(List<Opcion> acciones, String height) {
		super(acciones, height);
		buildMainLayout();
		setCompositionRoot(mainLayout);
		organizacionService=Injector.obtenerServicio(OrganizacionService.class);
		postConstruct();
		debugId();
	}
	private void debugId(){
		
	}
	public void postConstruct() {
		
		txtNombre.setInputPrompt("Nombre");
		txtNombre.setNullRepresentation(StringUtils.EMPTY);
		txtDescripcion.setInputPrompt("Descripcion");
		txtDescripcion.setNullRepresentation(StringUtils.EMPTY);
		txtCampo.setInputPrompt("Campo");
		txtCampo.setNullRepresentation(StringUtils.EMPTY);
		txtNroIntegrantes.setInputPrompt("Nro Integrantes");
		txtNroIntegrantes.setNullRepresentation(StringUtils.EMPTY);
		txtZonaOperacion.setInputPrompt("Zona Operacion");
		txtZonaOperacion.setNullRepresentation(StringUtils.EMPTY);
		txtUbicacionActivos.setInputPrompt("Ubicacion Activos");
		txtUbicacionActivos.setNullRepresentation(StringUtils.EMPTY);
		
		btnGuardar.addListener(this);
		btnEliminar.addListener(this);
		btnEliminar.setVisible(false);
		
        container = new TablaFiltroIndexedContainer();
		container.addContainerProperty(COLUMNA_ORGANIZACION, Organizacion.class,  null);
		container.addContainerProperty(COLUMNA_NOMBRE, String.class, null,"Nombre",TipoComponente.TEXT,true,100);
		container.addContainerProperty(COLUMNA_CAMPO, String.class, null,"Campo",TipoComponente.TEXT,true,50);
		container.addContainerProperty(COLUMNA_NRO_INTEGRANTE, Integer.class, null,"Nro Integrante", TipoComponente.TEXT, true,40);
		container.addContainerProperty(COLUMNA_ZONA_OPERACION, String.class, null,"Zona Operacion",TipoComponente.TEXT,true,100);
		container.addContainerProperty(COLUMNA_UBICACION_ACTIVO, String.class, null,"Ubicacion Activo",TipoComponente.TEXT,true,100);
		
		tblOrganizacion.setContainerDataSource(container);
		
		tblOrganizacion.setSelectable(true);
		tblOrganizacion.setImmediate(true);
		tblOrganizacion.addListener((TablaFiltroEnterListener)this);
		tblOrganizacion.addListener(new ValueChangeListener() {
			
			@Override
			public void valueChange(ValueChangeEvent event) {
				limpiar();
				if(tblOrganizacion.getValue()!=null){
					Item item=tblOrganizacion.getItem(tblOrganizacion.getValue());
					Organizacion organizacion=(Organizacion)item.getItemProperty(COLUMNA_ORGANIZACION).getValue();
					id=organizacion.getId();
					txtNombre.setValue(organizacion.getNombre());
					txtDescripcion.setValue(organizacion.getDescripcion());
					txtCampo.setValue(organizacion.getCampo());
					txtNroIntegrantes.setValue(organizacion.getNroIntegrantes());
					txtZonaOperacion.setValue(organizacion.getZonaOperacion());
					txtUbicacionActivos.setValue(organizacion.getUbicacionActivos());
					btnGuardar.setCaption("Modificar");
					btnEliminar.setVisible(true);
				}
			}
		});
		buscarOrganizacion(null);
	}
	
	private void buscarOrganizacion(Map<String, Object> map){
		Organizacion organizacionBuscar=new Organizacion();
		if(map!=null){
			organizacionBuscar.setNombre((String)map.get(COLUMNA_NOMBRE));
			organizacionBuscar.setCampo((String)map.get(COLUMNA_CAMPO));
			organizacionBuscar.setNroIntegrantes(HarecUtil.toBigDecimal((String)map.get(COLUMNA_NRO_INTEGRANTE)));
			organizacionBuscar.setZonaOperacion((String)map.get(COLUMNA_ZONA_OPERACION));
			organizacionBuscar.setUbicacionActivos((String)map.get(COLUMNA_UBICACION_ACTIVO));
		}
		List<Organizacion> organizaciones=organizacionService.buscar(organizacionBuscar);
		container.removeAllItems();
		int con=1;
		for (Organizacion organizacion : organizaciones) {
			Item item = container.addItem(con++);
			item.getItemProperty(COLUMNA_ORGANIZACION).setValue(organizacion);
			item.getItemProperty(COLUMNA_NOMBRE).setValue(organizacion.getNombre());
			item.getItemProperty(COLUMNA_CAMPO).setValue(organizacion.getCampo());
			item.getItemProperty(COLUMNA_NRO_INTEGRANTE).setValue(organizacion.getNroIntegrantes());
			item.getItemProperty(COLUMNA_ZONA_OPERACION).setValue(organizacion.getZonaOperacion());
			item.getItemProperty(COLUMNA_UBICACION_ACTIVO).setValue(organizacion.getUbicacionActivos());
		}
	}
	
	private void limpiar(){
		id=null;
		txtNombre.setValue(null);
		txtDescripcion.setValue(null);
		txtCampo.setValue(null);
		txtNroIntegrantes.setValue(null);
		txtZonaOperacion.setValue(null);
		txtUbicacionActivos.setValue(null);
		btnGuardar.setCaption("Agregar");
		btnEliminar.setVisible(false);
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar)){
			Organizacion organizacion=new Organizacion();
			organizacion.setId(id);
			organizacion.setNombre((String)txtNombre.getValue());
			organizacion.setDescripcion((String)txtDescripcion.getValue());
			organizacion.setCampo((String)txtCampo.getValue());
			organizacion.setNroIntegrantes(HarecUtil.toBigDecimal(txtNroIntegrantes.getValue()));
			organizacion.setZonaOperacion((String)txtZonaOperacion.getValue());
			organizacion.setUbicacionActivos((String)txtUbicacionActivos.getValue());
			if(organizacion.getId()==null){
				organizacionService.crear(organizacion);
			}else{
				organizacionService.actualizar(organizacion);
			}
			limpiar();
			tblOrganizacion.setValue(null);
			buscarOrganizacion(tblOrganizacion.getValues());
		}
		if(event.getButton().equals(btnEliminar)){
			organizacionService.eliminarXId(id);
			limpiar();
			tblOrganizacion.setValue(null);
			buscarOrganizacion(tblOrganizacion.getValues());
		}
	}
	
	@Override
	public void handleEnterAction(TablaFiltroEnterEvent event) {
		buscarOrganizacion(event.getDatos());
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}
	@AutoGenerated
	private HorizontalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new HorizontalLayout();
		pnlPrincipal.setStyleName("whiteBackGround");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		
		// pnl1
		pnl1 = buildPnl1();
		pnlPrincipal.addComponent(pnl1);
		
		// pnl2
		pnl2 = buildPnl2();
		pnlPrincipal.addComponent(pnl2);
		
		return pnlPrincipal;
	}
	@AutoGenerated
	private VerticalLayout buildPnl1() {
		// common part: create layout
		pnl1 = new VerticalLayout();
		pnl1.setImmediate(false);
		pnl1.setWidth("-1px");
		pnl1.setHeight("-1px");
		pnl1.setMargin(false);
		
		// lblFiltro
		lblFiltro = new Label();
		lblFiltro.setStyleName("h2");
		lblFiltro.setImmediate(false);
		lblFiltro.setWidth("500px");
		lblFiltro.setHeight("-1px");
		lblFiltro.setValue("Filtro Organizacion");
		pnl1.addComponent(lblFiltro);
		
		// tblOrganizacion
		tblOrganizacion = new TablaFiltro();
		tblOrganizacion.setImmediate(false);
		tblOrganizacion.setWidth("485px");
		tblOrganizacion.setHeight("400px");
		pnl1.addComponent(tblOrganizacion);
		
		return pnl1;
	}
	@AutoGenerated
	private VerticalLayout buildPnl2() {
		// common part: create layout
		pnl2 = new VerticalLayout();
		pnl2.setImmediate(false);
		pnl2.setWidth("-1px");
		pnl2.setHeight("-1px");
		pnl2.setMargin(false);
		pnl2.setSpacing(true);
		
		// lblAdministracion
		lblAdministracion = new Label();
		lblAdministracion.setStyleName("h2");
		lblAdministracion.setImmediate(false);
		lblAdministracion.setWidth("234px");
		lblAdministracion.setHeight("-1px");
		lblAdministracion.setValue("Administración Organizacion");
		pnl2.addComponent(lblAdministracion);
		
		// pnl2_1
		pnl2_1 = buildPnl2_1();
		pnl2.addComponent(pnl2_1);
		
		return pnl2;
	}
	@AutoGenerated
	private VerticalLayout buildPnl2_1() {
		// common part: create layout
		pnl2_1 = new VerticalLayout();
		pnl2_1.setImmediate(false);
		pnl2_1.setWidth("-1px");
		pnl2_1.setHeight("-1px");
		pnl2_1.setMargin(false);
		pnl2_1.setSpacing(true);
		
		// txtNombre
		txtNombre = new TextField();
		txtNombre.setCaption("Nombre");
		txtNombre.setImmediate(false);
		txtNombre.setWidth("300px");
		txtNombre.setHeight("-1px");
		pnl2_1.addComponent(txtNombre);
		
		// txtDescripcion
		txtDescripcion = new TextField();
		txtDescripcion.setCaption("Descripcion");
		txtDescripcion.setImmediate(false);
		txtDescripcion.setWidth("300px");
		txtDescripcion.setHeight("-1px");
		pnl2_1.addComponent(txtDescripcion);
		
		// txtCampo
		txtCampo = new TextField();
		txtCampo.setCaption("Campo");
		txtCampo.setImmediate(false);
		txtCampo.setWidth("300px");
		txtCampo.setHeight("-1px");
		pnl2_1.addComponent(txtCampo);
		
		// txtNroIntegrantes
		txtNroIntegrantes = new TextField();
		txtNroIntegrantes.setCaption("Nro Integrantes");
		txtNroIntegrantes.setImmediate(false);
		txtNroIntegrantes.setWidth("300px");
		txtNroIntegrantes.setHeight("-1px");
		pnl2_1.addComponent(txtNroIntegrantes);
		
		// txtZonaOperacion
		txtZonaOperacion = new TextField();
		txtZonaOperacion.setCaption("Zona Operacion");
		txtZonaOperacion.setImmediate(false);
		txtZonaOperacion.setWidth("300px");
		txtZonaOperacion.setHeight("-1px");
		pnl2_1.addComponent(txtZonaOperacion);
		
		// txtUbicacionActivos
		txtUbicacionActivos = new TextField();
		txtUbicacionActivos.setCaption("Ubicacion Activos");
		txtUbicacionActivos.setImmediate(false);
		txtUbicacionActivos.setWidth("300px");
		txtUbicacionActivos.setHeight("-1px");
		pnl2_1.addComponent(txtUbicacionActivos);
		
		// lytBotones
		lytBotones = buildLytBotones();
		pnl2_1.addComponent(lytBotones);
		pnl2_1.setComponentAlignment(lytBotones, new Alignment(20));
		
		return pnl2_1;
	}
	@AutoGenerated
	private HorizontalLayout buildLytBotones() {
		// common part: create layout
		lytBotones = new HorizontalLayout();
		lytBotones.setImmediate(false);
		lytBotones.setWidth("-1px");
		lytBotones.setHeight("-1px");
		lytBotones.setMargin(false);
		lytBotones.setSpacing(true);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Agregar");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		lytBotones.addComponent(btnGuardar);
		
		// btnEliminar
		btnEliminar = new Button();
		btnEliminar.setCaption("Eliminar");
		btnEliminar.setImmediate(false);
		btnEliminar.setWidth("-1px");
		btnEliminar.setHeight("-1px");
		lytBotones.addComponent(btnEliminar);
		
		return lytBotones;
	}

}
